"""
此模块用于测试 OLED 屏幕功能。程序会在 OLED 屏幕上显示不同类型的信息，包括静态文本、多行文本和动态更新的文本。
导入库：导入 luma.core 和 luma.oled 相关库用于控制 OLED 屏幕，PIL 库用于加载字体，time 库用于控制显示时间。
初始化设置：设置中文显示的字体和大小，初始化 OLED 显示屏并加载中文字体。
定义显示函数：display_text_on_oled 函数用于在 OLED 屏幕上显示指定的文本信息，支持多行文本显示。
定义测试函数：test_oled 函数中，依次进行静态文本显示、多行文本显示和动态更新文本显示测试，每个测试之间间隔一定时间。
异常处理：使用 try-except-finally 结构捕获 KeyboardInterrupt 异常（即用户按下 Ctrl+C），确保程序终止时清除 OLED 屏幕显示。
主程序：调用 test_oled 函数开始测试。
"""
from luma.core.interface.serial import i2c
from luma.core.render import canvas
from luma.oled.device import ssd1306
from PIL import ImageFont
import time

# 中文显示设置
CHINESE_FONT_PATH = 'F:/fruit_AI/wqy-zenhei.ttc'  # 中文字体文件路径，使用绝对路径
FONT_SIZE = 24  # 字体大小

# 初始化 OLED 显示屏
serial = i2c(port=1, address=0x3C)
oled_device = ssd1306(serial)

# 加载支持中文的字体
font = ImageFont.truetype(CHINESE_FONT_PATH, FONT_SIZE)

def display_text_on_oled(message):
    """
    在 OLED 屏幕上显示指定的文本信息。

    :param message: 要显示的文本信息
    """
    # 使用 with 语句创建一个画布对象，用于在 OLED 屏幕上进行绘制操作
    # canvas(oled_device) 会创建一个与 OLED 设备关联的画布
    with canvas(oled_device) as draw:
        # 计算行间距，行间距为字体大小加上 5 个像素，用于控制多行文本之间的垂直距离
        line_spacing = FONT_SIZE + 5
        # 定义文本显示的起始垂直偏移量，即文本距离屏幕顶部的像素数
        y_offset = 5
        # 初始化当前文本的垂直位置，从起始偏移量开始
        y = y_offset
        # 将传入的文本按换行符 '\n' 进行分割，得到一个包含多行文本的列表
        for line in message.split('\n'):
            # 在画布上绘制一行文本
            # (0, y) 表示文本的起始坐标，0 为水平位置，y 为垂直位置
            # line 是当前要绘制的文本内容
            # fill="white" 表示文本的颜色为白色
            # font=font 表示使用之前加载的支持中文的字体
            draw.text((0, y), line, fill="white", font=font)
            # 更新垂直位置，为下一行文本的绘制做准备
            # 垂直位置增加一个行间距的距离
            y += line_spacing

def test_oled():
    """
    测试 OLED 屏幕功能，依次显示不同类型的信息。
    """
    try:
        print("开始测试 OLED 屏幕...")

        # 显示静态文本
        display_text_on_oled("OLED 测试")
        time.sleep(3)

        # 显示多行文本
        multi_line_text = "第一行文本\n第二行文本\n第三行文本"
        display_text_on_oled(multi_line_text)
        time.sleep(3)

        # 动态更新文本
        for i in range(1, 6):
            display_text_on_oled(f"动态计数: {i}")
            time.sleep(1)

        print("OLED 屏幕测试完成。")
    except KeyboardInterrupt:
        print("用户中断测试，程序终止。")
    finally:
        oled_device.clear()  # 清除 OLED 屏幕显示

if __name__ == "__main__":
    test_oled()
